package co.edu.udea.iw.rtf.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.rtf.dao.PreguntaDAO;
import co.edu.udea.iw.rtf.dto.Pregunta;
import co.edu.udea.iw.rtf.exception.RTFDaoException;

public class PreguntaDAOImpl extends HibernateDaoSupport implements PreguntaDAO {

	/**
	 * Metodo que almacena una pregunta dada en la base de datos
	 * Crea una session de Hibernate y Tansaction con la informacion de la pregunta
	 * Realiza el commit en la base de datos
	 * @param pregunta
	 */
	@Override
	public void guardar(Pregunta pregunta) throws RTFDaoException {
		// TODO Auto-generated method stub

		Session session = null;
		Transaction tx = null;
		try{
			
			session = getSession();
			tx = session.beginTransaction();
			session.save(pregunta);
			tx.commit();
			
		}catch (HibernateException e) {
			throw new RTFDaoException(e);
		}
		
	}

	/**
	 * Metodo que actualiza una pregunta en la base de datos
	 * Crea la session de Hibernate y Transaccion con los datos que se van a  actualizar
	 * Realiza el commit en la base de datos
	 * @param pregunta
	 */
	@Override
	public void actualizar(Pregunta pregunta) throws RTFDaoException {
		// TODO Auto-generated method stub

		Session session = null;
		Transaction tx = null;
		try{
			
			session = getSession();
			tx = session.beginTransaction();
			session.update(pregunta);
			tx.commit();
			
		}catch (HibernateException e) {
			throw new RTFDaoException(e);
		}
	}

	/**
	 * Metodo que obtiene la lista de preguntas que hay en la tabla preguntas
	 * crea la Session de Hibernate para obtener los datos de acuerdo a la clase Pregunta.class
	 * Asigna a el Array List la lista de preguntas encontradas en la consulta
	 * @retur List<Pregunta>
	 */
	@Override
	public List<Pregunta> obtener() throws RTFDaoException {
		// TODO Auto-generated method stub

		List<Pregunta> preguntas = new ArrayList<Pregunta>();
		
		Session sesion = null;
		try{
			sesion = getSession();
			
			preguntas = sesion.createCriteria(Pregunta.class).list();
			
			//sesion.close();
			return preguntas;
			
			
		}catch (HibernateException e) {
			throw new RTFDaoException(e);
		}
		
		
		
	}

	/**
	 * Metodo que obtiene una pregunta de acuerdo a su codigo
	 * Crea la session Hibernate para condultar en la base de datos la pregunta que cumpla con el codigo
	 * retorna una variable de tipo Pregunta con la pregunta encontrada
	 * @return Pregunta
	 * @param codigo
	 */
	@Override
	public Pregunta obtener(Integer codigo) throws RTFDaoException {
		// TODO Auto-generated method stub
		
		Pregunta pregunta;
		Session sesion = null;
		try{
			sesion = getSession();
			
			pregunta = (Pregunta)sesion.get(Pregunta.class, codigo);
			
			//sesion.close();
				
			return pregunta;
		}catch (HibernateException e) {
			throw new RTFDaoException(e);
		}
		
	}

}
